package ObjectOriented;

/**
 * 字符串，Java中的字符串是引用类型，内部是通过char[]数组实现的，字符串是不可变的，一旦创建就不能被修改
   1、比较字符串：==比较的是引用，equals比较的是内容;因此两个字符串比较，必须总是使用equals()方法。
   2、字符串的拼接：使用+号进行拼接，会产生新的字符串对象，而不是改变原有的字符串对象。

   字符串相关方法：
    1、length()：获取字符串长度
    2、charAt(int index)：获取指定索引处的字符
    3、equals(Object obj)：比较两个字符串是否相等
    4、equalsIgnoreCase(String str)：忽略大小写比较两个字符串是否相等
    5、startsWith(String prefix)：判断字符串是否以指定前缀开始
    6、endsWith(String suffix)：判断字符串是否以指定后缀结束
    7、indexOf(int ch)：查找指定字符在字符串中第一次出现的索引
    8、lastIndexOf(int ch)：查找指定字符在字符串中最后一次出现的索引
    9、substring(int beginIndex, int endIndex)：获取子字符串
    10、toCharArray()：将字符串转换为char数组
    11、toLowerCase()：将字符串转换为小写
    12、toUpperCase()：将字符串转换为大写
    13、trim()：去除字符串两端的空白字符
    14、strip()：去除字符串两端的空白字符,包括Unicode空白字符
    15、isEmpty()：判断字符串是否为空
    16、isBlank()：判断字符串是否为空白字符
    17、replace(char oldChar, char newChar)：替换字符串中的字符
    18、replace(CharSequence target, CharSequence replacement)：替换字符串中的字符串
    19、split(String regex)：按正则表达式分割字符串
    20、join(CharSequence delimiter, CharSequence... elements)：连接字符串数组
    21、format(String format, Object... args)：格式化字符串
    22、String.valueOf(Object obj)：将对象转换为字符串
  字符串转换为其他类型
    1、Integer.parseInt(String s)：将字符串转换为int
    2、long parseLong(String s)：将字符串转换为long
    3、float parseFloat(String s)：将字符串转换为float
    4、double parseDouble(String s)：将字符串转换为double
    5、Boolean.parseBoolean(String s)：将字符串转换为boolean

  字符编码含义：为了给字符编码，美国国家标准学会（American National Standard Institute：ANSI）制定了一套英文字母、数字和常用符号的编码，它占用一个字节，编码范围从0到127，最高位始终为0，称为ASCII编码。
 */
public class LearString {
  public static void main(String[] args) {
    String s1 = "hello";
    String s2 = "Hello".toLowerCase();
    LearnStringBuilder sb = new LearnStringBuilder();
    sb.strAppend();

    System.out.println(s1 == s2); // true
    System.out.println(s2); // true
    System.out.println(s1.equals(s2)); // true

  }
}

/**
 * StringBuilder和StringBuffer
   StringBuilder: 是一个可变对象，可以预分配缓冲区，这样，往StringBuilder中新增字符时，不会创建新的临时对象
      可以通过append()方法链式添加字符，最后通过toString()方法得到String对象
   StringBuffer: StringBuffer是StringBuilder的线程安全版本，现在很少使用。
 */

class LearnStringBuilder {
  /**
   * 1024 是预分配的缓冲区大小，避免多次扩容，提高效率
   */
  StringBuilder sb = new StringBuilder(1024);

  public void strAppend() {
    for (int i = 0; i < 1000; i++) {
      sb.append(i)
        .append(", ");
    }
  
    System.out.println(sb.toString()); 
  }
}